查看原文
其他

浅析如何高效的使用MVP

2016-05-27

作者 还不走A

本文由还不走A投稿。

还不走A的博客地址:

http://blog.csdn.net/dantestones


本文的是还不走A在本公众号投的第二篇文章,可以说是上一篇Android mvp 架构的自述文章的延伸,这里也非常感谢其支持。




前一篇文章Android mvp 架构的自述中我简单的介绍了mvp,以及怎么写mvp。我自己也将mvp运用到了项目中,其实mvp并没有固定的写法,正确的去理解架构的思想,都可以有自己独特的mvp写法。git上也有很多例子,比如google的android-architecture,simple哥的Android 源码设计模式解析与实战中也有mvp的讨论。


这里参考了simple哥做了一个通用版的mvp,并对google的MVP做了一点自己的解析。


1Presenter持有Activity对象可能导致的内存泄漏问题
   

只要用过mvp这个问题可能很多人都知道。写mvp的时候,presenter会持有view,如果presenter有后台异步的长时间的动作,比如网络请求,这时如果返回退出了Activity,后台异步的动作不会立即停止,这里就会有内存泄漏的隐患,所以会在presenter中加入一个销毁view的方法。


现在就在之前的项目中做一下修改:




presenter中增加了类似的生命周期的方法,用来在退出Activity的时候取消持有Activity。


但是在销毁后需要思考一点,后台的延时操作返回时,这个时候view被销毁了,如果接着去调用view的方法就 会抛出空指针异常。所以在后台的延时操作中需要考虑到这种可能产生空指针的情况,尤其是网络请求。


2BasePresenter
   

如果每一个Activity都需要做绑定和解绑操作就太麻烦了,现在我希望可以有一个通用的presenter来为我们添加view的绑定与销毁。




因为不能限定死传入的View,所以使用泛型来代替传入的对象。通过这个通用的presenter我就可以把原来的MvpPresenter简化成下面的样子




3BaseView
   

界面需要提供的UI方法中会有很多类似的UI方法,可以把它们提取到一个公共的父类接口中。比如提取显示loading界面和隐藏loading界面的方法,其他的view层接口就可以直接继承BaseView接口,不必重复的写显示和隐藏loading界面方法。




4

BaseMvpActivity


presenter绑定到activity和View的绑定和解绑操作是每个Activity都会去做的,同样这里我也希望能有一个父类来完成这个统一的操作。




同样使用泛型来提取通用的逻辑,presenter的初始化,以及view的绑定和解绑操作都提取到父类Activity中。向外部提供了一个 

同样使用泛型来提取通用的逻辑,presenter的初始化,以及view的绑定和解绑操作都提取到父类Activity中。向外部提供了一个 initPresenter();方法用来初始化presenter,如果想创建不同参数的构造函数都可以随意去创建。


5更加通用的例子

通过上面的base父类,对之前的例子进行优化,写一个更加好用的例子。


  • NewMvpView 继承BaseView接口,添加自己的初始化ListView和Toast信息方法


  • NewMvpPresenter 继承BasePresenter类,增加网络请求和处理点击事件的方法



代码上面已经出现过。

  • NewMvpActivity



最终的成果,我们只需要在Acitivity中传入泛型对象,在initPresenter() 方法中初始化Presenter对象,然后就可以直接使用presenter对象了,当然View的接口还是要自己去实现。 


恩,以上的方法就完成了MVP一些简单的封装。


6扩展阅读
   

作者的原文中还包含对官方MVP架构的解析,由于篇幅原因,大家可以点击阅读原文继续阅读。此外关于官方MVP架构的解析也可以通过下面的文章进行学习。


  • http://www.jianshu.com/p/389c9ae1a82c

  • https://github.com/googlesamples/android-architecture




--欢迎长按或者扫码关注--

-本公众号支持投稿,直接投递md文件或者链接至我邮箱-


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存